// C++11 thread库的使用
#include <iostream>
#include <thread>

void routine()
{
    std::cout << "i am  a new thread -> " << std::this_thread::get_id() << std::endl;
}

void Print(int begin, int end)
{
    for(;begin < end; begin++)
    {
        std::cout << begin << std::endl;
    }
}

int main()
{
    std::thread t1(routine);
    std::thread t2(Print, 0, 10);
    std::thread t3([](){
        std::cout << " i am a new thread ->" << std::this_thread::get_id() << std::endl;
    });

    // join用来回收子线程资源，如果子线程结束了，但是没有被主线程回收，就会进入僵尸，导致资源泄露
    //t1.join();
    //t2.join();
    //t3.join();

    // 但其实为了避免未定义的行为，在进行join或者detach之前，我们必须得先判断线程是否是可连接的
    // joinable返回true的情况：
    //     1.线程还没有被join
    //     2.线程还没有被detach
    //     3.线程对象底层有对应的线程，即创建时分配了线程的函数入口
    // joinable返回false的情况：
    //     1.当线程已经被join
    //     2.线程已经被detach
    //     3.线程对象底层并没有绑定的线程
    if(t1.joinable())
        t1.join();
    if(t2.joinable())
        t2.join();
    if(t3.joinable())
        t3.join();
    return 0;
}